//package com.zed.api.domain.repository;
//
//
//import cn.hutool.cache.Cache;
//
//import java.util.*;
//import java.util.stream.Collectors;
//
///**
// * 缓存查询仓储
// *
// * @author Zed
// */
//public abstract class CacheSupportQueryRepository<P, T> extends ApplicationContextQueryRepository<P, T> {
//
//    private Class<?> cacheType;
//    private ObjectRegistration<Cache<T>> registration;
//    private CacheRepository cacheRepository;
//    private CacheFactory cacheFactory;
//
//    public CacheSupportQueryRepository(Class<?> cacheType) {
//        this.cacheType = Objects.requireNonNull(cacheType, "\"cacheType\" cannot be null.");
//    }
//
//    @Override
//    public final T findById(P id) {
//        if (id == null) return null;
//        String identifier = this.toIdentifier(id);
//        Cache<T> cacheSpace = this.getCache();
//        T result = cacheSpace.findById(identifier, () -> this.doFindById(id));
//        this.awareExtend(result);
//        return result;
//    }
//
//    /**
//     * 注入扩展接口
//     *
//     * @param target {@link T},目标类
//     */
//    private void awareExtend(T target) {
//        ApplicationContextAwareExtend.tryToBind(target, this.getContext());
//        ApplicationEventPublisherAwareExtend.tryToBind(target, this.eventPublisher);
//    }
//
//    @Override
//    public final List<T> getByIds(Collection<P> ids) {
//        if (ids == null || ids.isEmpty()) return Collections.emptyList();
//
//        Map<String, P> map = new HashMap<>(ids.size());
//        for (P id : ids) {
//            String identifier = this.toIdentifier(id);
//            map.put(identifier, id);
//        }
//
//        Cache<T> cache = this.getCache();
//
//        List<T> result = cache.getByIds(map.keySet(), notFound -> {
//            List<P> pIds = notFound.stream().map(map::get).collect(Collectors.toList());
//            Map<String, T> foundResult = this.doGetByIds(pIds);
//            return foundResult == null ? Collections.emptyMap() : foundResult;
//        });
//
//        for (T item : result) {
//            this.awareExtend(item);
//        }
//
//        return result;
//
//
//    }
//
//    /**
//     * 按主键集合获取实例
//     *
//     * @param ids {@link List},未在缓存中加载得主键集合
//     * @return {@link List},从Loader加载得实体对象
//     */
//    protected abstract Map<String, T> doGetByIds(List<P> ids);
//
//    /**
//     * 按主键查找实例
//     *
//     * @param id {@link P}
//     * @return {@link T}
//     */
//    protected abstract T doFindById(P id);
//
//    /**
//     * 将主键转换为字符串标识符
//     *
//     * @param id {@link P}
//     * @return {@link String}
//     */
//    protected abstract String toIdentifier(P id);
//
//    /**
//     * 缓存配置
//     * <p>
//     * 默认为读写后存活5分钟
//     *
//     * @return {@link CacheConfig}
//     */
//    public CacheConfig getCacheConfig() {
//        return CacheConfig.newBuilder()
//                .expireAfterAccess((long) (5 * 60))
//                .build();
//    }
//
//    /**
//     * 缓存
//     *
//     * @return {@link Cache}
//     */
//    protected Cache<T> getCache() {
//        return this.registration.getRegistObject();
//    }
//
//    /**
//     * 缓存类型
//     *
//     * @return {@link Class}
//     */
//    @SuppressWarnings("unchecked")
//    public Class<T> getCacheType() {
//        return (Class<T>) this.cacheType;
//    }
//
//    /**
//     * 缓存资源库
//     *
//     * @return the cacheRepository {@link CacheRepository}
//     */
//    public CacheRepository getCacheRepository() {
//        return this.cacheRepository;
//    }
//
//    /**
//     * 设置缓存资源库
//     *
//     * @param cacheRepository the cacheRepository to set
//     */
//    @Resource
//    public void setCacheRepository(CacheRepository cacheRepository) {
//        this.cacheRepository = cacheRepository;
//    }
//
//    /**
//     * 缓存工厂
//     *
//     * @return the cacheFactory
//     */
//    public CacheFactory getCacheFactory() {
//        return this.cacheFactory;
//    }
//
//    /**
//     * 设置缓存工厂
//     *
//     * @param cacheFactory the cacheFactory to set
//     */
//    @Resource
//    public void setCacheFactory(CacheFactory cacheFactory) {
//        this.cacheFactory = cacheFactory;
//    }
//
//    @PostConstruct
//    public synchronized void init() {
//        if (this.registration == null) {
//            this.registration = this.getCacheRepository().registerCache(this.getCacheType(),
//                    type -> this.cacheFactory.createCache(type, getCacheConfig())
//            );
//        }
//    }
//
//    @PreDestroy
//    public synchronized void destroy() {
//        if (this.registration != null) {
//            this.registration.unregister();
//            this.registration = null;
//        }
//    }
//
//
//}
